import axios from 'axios';

import { axiosConfig } from '../env.js';

// 创建基金API专用客户端（与其他API模块风格一致）
const apiClient = axios.create(axiosConfig);

/**
 * 获取所有基金标签（用于筛选）
 * 对应接口：GET /api/tag/all
 */
export const getAllTags = () => {
  return apiClient.get('/tag/all');
};

/**
 * 分页查询基金列表
 * 对应接口：GET /api/fund/page
 * @param {Object} params - 分页及筛选参数
 * @param {number} params.page - 页码（前端从1开始，后端从0开始）
 * @param {number} params.size - 每页条数
 * @param {string} [params.keyword] - 搜索关键词（基金名称/代码）
 * @param {string[]} [params.tagNames] - 标签筛选列表
 */
export const getFundsByPage = (params) => {
  return apiClient.get('/fund/page', {
    params: {
      page: params.page - 1, // 转换为后端需要的0基页码
      size: params.size,
      keyword: params.keyword || null,
      tagNames: params.tagNames?.length ? params.tagNames : null,
    },
    paramsSerializer: (params) => {
      // 处理数组参数序列化（如tagNames多值传递）
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (Array.isArray(value)) {
          value.forEach(val => searchParams.append(key, val));
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    },
  });
};

/**
 * 获取基金详情（画像）
 * 对应接口：GET /api/fund-profile/{fundCode}
 * @param {string} fundCode - 基金代码
 */
export const getFundProfile = (fundCode) => {
  return apiClient.get(`/fund-profile/${fundCode}`);
};

/**
 * 根据标签筛选基金公司
 * @description 通过选定的标签数组，获取符合条件的基金公司列表
 * @param {string[]} tags - 标签名称数组（如['股票型', '高风险']）
 */
export const getCompaniesByTags = (tags) => {
  const res = apiClient.get('/fund-company/by-tags', {
    params: { tags },
    paramsSerializer: params => {
      const searchParams = new URLSearchParams()
      for (const key in params) {
        const value = params[key]
        if (Array.isArray(value)) {
          value.forEach(v => searchParams.append(key, v))
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value)
        }
      }
      return searchParams.toString()
    }
  })
  return res
}

/**
 * 分页获取基金公司列表
 * @description 支持关键词搜索的分页查询，用于基金公司列表展示
 * @param {number} page - 页码（从0开始计数）
 * @param {number} size - 每页显示数量
 * @param {string} [keyword=''] - 搜索关键词（可选，用于筛选公司名称）
 */
export const getCompaniesPage = (page, size, keyword = '') => {
  const res = apiClient.get('/fund-company/page', {
    params: {
      page,
      size,
      keyword
    }
  })
  return res
}

/**
 * 获取指定基金公司旗下的基金列表
 * @description 根据公司名称查询该公司管理的所有基金
 * @param {string} companyName - 基金公司全称
 */
export const getCompanyFunds = (companyName) => {
  const res = apiClient.get('/fund-company/funds', {
    params: { companyName }
  })
  return res
}

/**
 * 按标签筛选基金经理
 * 对应接口：GET /api/fund-manager/by-tags
 * @param {string[]} tags - 标签名称数组
 */
export const getManagersByTags = (tags) => {
  return apiClient.get('/fund-manager/by-tags', {
    params: { tags },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (Array.isArray(value)) {
          value.forEach(val => searchParams.append(key, val));
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    }
  });
};

/**
 * 分页查询基金经理列表
 * 对应接口：GET /api/fund-manager/page
 * @param {Object} params - 分页及搜索参数
 * @param {number} params.page - 页码（前端从1开始，后端从0开始）
 * @param {number} params.size - 每页条数
 * @param {string} [params.keyword] - 搜索关键词（基金经理姓名）
 */
export const getManagersByPage = (params) => {
  return apiClient.get('/fund-manager/page', {
    params: {
      page: params.page - 1, // 转换为后端需要的0基页码
      size: params.size,
      keyword: params.keyword || ''
    },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (Array.isArray(value)) {
          value.forEach(val => searchParams.append(key, val));
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    }
  });
};

/**
 * 获取基金经理管理的基金列表
 * 对应接口：GET /api/fund-manager/funds
 * @param {string} managerName - 基金经理姓名
 */
export const getManagerFunds = (managerName) => {
  return apiClient.get('/fund-manager/funds', {
    params: { managerName },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (Array.isArray(value)) {
          value.forEach(val => searchParams.append(key, val));
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    }
  });
};

/**
 * 分页查询基金组合列表
 * 对应接口：GET /api/portfolio/page
 * @param {Object} params - 分页及用户参数
 * @param {number} params.userId - 用户ID
 * @param {number} params.page - 页码（前端从1开始，后端从0开始）
 * @param {number} params.size - 每页条数
 */
export const getPortfoliosByPage = (params) => {
  return apiClient.get('/portfolio/page', {
    params: {
      userId: params.userId,
      page: params.page - 1, // 转换为后端需要的0基页码
      size: params.size
    },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    },
  });
};

/**
 * 获取组合中的基金项（基金代码列表）
 * 对应接口：GET /api/portfolio/item/{portfolioId}
 * @param {number} portfolioId - 组合ID
 */
export const getPortfolioItems = (portfolioId) => {
  return apiClient.get(`/portfolio/item/${portfolioId}`);
};

/**
 * 批量获取基金详情（通过基金代码）
 * 对应接口：GET /api/fund/by-codes
 * @param {string[]} codes - 基金代码数组
 */
export const getFundsByCodes = (codes) => {
  return apiClient.get('/fund/by-codes', {
    params: { codes },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (Array.isArray(value)) {
          value.forEach(val => searchParams.append(key, val));
        } else if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    },
  });
};

/**
 * 从组合中移除基金
 * 对应接口：DELETE /api/portfolio/item/remove
 * @param {number} portfolioId - 组合ID
 * @param {string} fundCode - 基金代码
 */
export const removeFundFromPortfolio = (portfolioId, fundCode) => {
  return apiClient.delete('/portfolio/item/remove', {
    params: { portfolioId, fundCode },
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      for (const key in params) {
        const value = params[key];
        if (value !== null && value !== undefined) {
          searchParams.append(key, value);
        }
      }
      return searchParams.toString();
    },
  });
};

/**
 * 删除基金组合
 * 对应接口：DELETE /api/portfolio/delete/{portfolioId}
 * @param {number} portfolioId - 组合ID
 */
export const deletePortfolio = (portfolioId) => {
  return apiClient.delete(`/portfolio/delete/${portfolioId}`);
};

export const savePortfolio = (params) => {
  return apiClient.post('/portfolio/save', params)
}

/**
 * 获取基金标签聚类数据（后端接口：GET /api/tags/clusters）
 * @returns {Promise<Array>} 聚类数组（结构同后端返回JSON）
 */
export const getFundTagClusters = () => {
  return apiClient.get('/tags/clusters');
};

/**
 * 获取相似基金推荐
 * 对应接口：GET /api/recommendations/similar
 * @param {string} fundCode - 基金代码
 */
export const getSimilarFunds = (fundCode) => {
  return apiClient.get(`/recommendations/similar?fundCode=${fundCode}`)
}
